package edu.ynu.se.xiecheng.achitectureclass.util;

import com.auth0.jwt.JWT;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.exceptions.JWTDecodeException;
import com.auth0.jwt.interfaces.DecodedJWT;
import com.auth0.jwt.interfaces.JWTVerifier;

import java.util.Calendar;

public class JWTUtils {
    //签名密钥（不能让别人知道）
    private static final String secretKey = "Shiro_JWT";

    /**
     * 根据要放入的有效荷载信息生成token
     * @param userName 用户名
     * @param days 过期天数
     * @return
     */
    public static String creatToken(String userName,int days){
        //声明过期时间（以天计算）
        Calendar instance = Calendar.getInstance();
        instance.add(Calendar.DATE,days);
        //生成JWT token
        return JWT.create()
                .withClaim("userName",userName)
                .withExpiresAt(instance.getTime())
                .sign(Algorithm.HMAC256(secretKey));
    }


    /**
     * 验证token
     * @param token
     * @return
     */
    public static boolean verifyToken(String token){
        try{
            //验证token 签名有效 + 未过期
            JWTVerifier verifier = JWT.require(Algorithm.HMAC256(secretKey)).build();
            verifier.verify(token);
            return true;
        }catch (Exception e){
            //有异常抛出表示验证失败，token无效
            return false;
        }
    }

    /**
     * 获得token中的信息，无需secret解密也能获得（不过可能是传输出错的信息）
     */
    public static String getUserName(String token){
        try {
            DecodedJWT jwt = JWT.decode(token);
            return jwt.getClaim("userName").asString();
        } catch (JWTDecodeException e) {
            return null;
        }
    }
}
